package com.example.selenium.core.other;

import com.alibaba.fastjson.JSONObject;
import com.example.selenium.domain.WaybillDto2;
import com.example.selenium.util.RedisUtil;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;

@Component
public class WaybillU {


    public WaybillU(){
        System.out.println("进来了WaybillU...................");
    }

    @Autowired
    private RedisUtil redisUtil;

    /**
     * 基础集合
     */
    private static final String BASE_LIST ="waybill:baseMap:";

    /**
     * 临时集合
     */
    private static final String TEMP_LIST="waybill:tempMap:";

    /**
     * 最后一次查询新建的运单时间
     */
    public static final String LAST_QUERY_FOR4_TIME="waybill:lastQueryTimeFor4Hours:";


    /**
     * 最后一次查询发票列表的时间
     */
    public static final String LAST_QUERY_TIME_FOR_INVOICE="waybill:lastQueryTimeForInvoice:";


    /**
     * 从redis中获取运单数据
     */
    public Map hmGetData(String key){
        Map<String,String> waybillMap = (Map)redisUtil.hmget(key);
        return waybillMap;
    }

    /**
     * hash
     * @param key
     * @param list
     */
    public void hPut(String key,List<WaybillDto2> list){
        if (CollectionUtils.isNotEmpty(list)){
            list.stream().forEach(item->{
                String yytBillId = item.getRelWaybillId();
                String waybillStr = JSONObject.toJSONString(item);
                redisUtil.hset(key,yytBillId,waybillStr);
            });
        }
    }

    public void zAdd(String key,List<WaybillDto2> list){
        if (CollectionUtils.isNotEmpty(list)){
            list.stream().forEach(item->{
                Long yytBillId = Long.parseLong(item.getRelWaybillId());
                String waybillStr = JSONObject.toJSONString(item);
                redisUtil.zAdd(key,waybillStr,yytBillId.doubleValue());
            });
        }
    }

    /**
     * set集合添加
     * @param key
     * @param list
     */
    public void sAdd(String key,List<WaybillDto2> list){
        if (CollectionUtils.isNotEmpty(list)){
            list.stream().forEach(item->{
                Long yytBillId = Long.parseLong(item.getRelWaybillId());
                String waybillStr = JSONObject.toJSONString(item);
                redisUtil.zAdd(key,waybillStr,yytBillId.doubleValue());
            });
        }
    }


    /**
     * 新的集合跟老的集合进行比较，取出新的集合中的差集
     * @param key1 基础集合key
     * @param key2 临时集合key，返回key2的差集
     */
    public Set getNewListDifference(String key1,String key2){
            Map<String,String> oldMap = hmGetData(key1);
            Set<String> oldKeys = oldMap.keySet();
            String oldBillKey = "oldBillIds:";
            redisUtil.sSet(oldBillKey,oldKeys.toArray());

            Set<String> collect =  hmGetData(key2).keySet();
            String newBillKey = "newBillIds:";
            redisUtil.sSet(newBillKey,collect.toArray());
            Set set = redisUtil.sDifference(newBillKey, oldBillKey);
            redisUtil.del(newBillKey);
            redisUtil.del(oldBillKey);

            return set;
    }

    /**
     * 将拉取新的运单插入redis中
     * @param key
     * @param newList
     */
    public void putNew(String key,List<WaybillDto2> newList){
        redisUtil.hdel(key);
        hPut(key,newList);
    }


    /**
     * 拿到list数据后，进行遍历取差集操作
     * @param list
     */
    public List<WaybillDto2> excuteSave(List<WaybillDto2> list){
        List<WaybillDto2> excelList = new ArrayList<>();

        // 1. 判断是否存在该key，存在则说明之前已经有存储过数据了
        boolean hasKey = redisUtil.hasKey(BASE_LIST);
        if(hasKey){
            // 把新数据存入到临时中
            hPut(TEMP_LIST,list);

            // 返回集合中的差集(新集合TEMP_LIST)
            Set newListDiffBillIds = getNewListDifference(BASE_LIST, TEMP_LIST);

            if(CollectionUtils.isNotEmpty(newListDiffBillIds)){
                Iterator iterator = newListDiffBillIds.iterator();
                while (iterator.hasNext()){
                    String billId = (String)iterator.next();
                    String waybill = (String)redisUtil.hget(TEMP_LIST, billId);
                    WaybillDto2 waybillDto2 = JSONObject.parseObject(waybill, WaybillDto2.class);
                    excelList.add(waybillDto2);
                }
            }

            // 1.2 把老集合中的数据删掉，并把新集合设置进去
            redisUtil.del(BASE_LIST);
            redisUtil.del(TEMP_LIST);

            // 1.3 将新集合存入redis中
            hPut(BASE_LIST,list);
        }else{
            hPut(BASE_LIST,list);
            excelList.addAll(list);
        }
        return excelList;
    }

    /**
     * 获取最后一次查询时间
     * @return
     */
    public String getLastQueryTime(){
        // 七月份重新抓到了7-27号
        //
        //redisUtil.set(LAST_QUERY_FOR4_TIME,"2021-05-01 01:00:00");
        Object obj = redisUtil.get(LAST_QUERY_FOR4_TIME);
        if (obj==null){
            String lastTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+" 00:00:00";
            redisUtil.set(WaybillU.LAST_QUERY_FOR4_TIME,lastTime);
            return lastTime;
        }else{
            return (String)obj;
        }
    }



    // *****************************************************更新3天内的运单状态******************************************************************



    public static void main(String[] args) {
        String lastTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+" 00:00:00";
        System.out.println(lastTime);
    }
}
